package com.example.addrparserdemo.util;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StopWatch;
import tech.spiro.addrparser.io.RegionDataInput;
import tech.spiro.addrparser.io.rdbms.RdbmsRegionDataInput;
import tech.spiro.addrparser.parser.LocationParserEngine;
import tech.spiro.addrparser.parser.ParserEngineException;

import javax.sql.DataSource;
import java.util.Objects;

/**
 * 位置解析引擎，线程安全单例
 * @author leiguoqing
 */
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class LocationParserEngineHolder {

    /**
     * 位置解析引擎
     */
    private static volatile LocationParserEngine engine;

    private static final String TABLE_NAME = "t_region_data";


    /**
     * 获取位置解析引擎
     *
     * @return the engine
     */
    public static LocationParserEngine getEngine() {
        if (Objects.nonNull(engine)) {
            return engine;
        }

        synchronized (LocationParserEngineHolder.class) {
            if (Objects.nonNull(engine)) {
                return engine;
            }
            // javax.sql.DataSource 数据源
            // 可以替换为 Spring 管理的数据源
            DataSource ds = JdbcUtils.getDataSource();

            // 关系型数据库区域数据输入
            RegionDataInput regionDataInput = new RdbmsRegionDataInput(ds, TABLE_NAME);

            // 创建并初始化位置解析引擎，一般配置为全局单例
            engine = new LocationParserEngine(regionDataInput);
            try {
                StopWatch sw = new StopWatch("初始化位置解析引擎");
                sw.start();

                // 初始化，加载数据，比较耗时
                engine.init();

                sw.stop();
                System.out.println(sw.shortSummary());
            } catch (ParserEngineException e) {
                log.error("初始化位置解析引擎异常：", e);
                return null;
            }
            return engine;
        }
    }

}
